/**
 * errors.js - 自定义错误类
 * 
 * 这个模块定义了应用程序中使用的自定义错误类。
 * 它们用于提供更具描述性的错误，并简化错误处理。
 */

/**
 * API错误类
 * 
 * 表示API操作中的错误，包括状态码、消息和可选的错误详情。
 */
class ApiError extends Error {
  /**
   * 创建一个新的API错误
   * 
   * @param {Number} statusCode - HTTP状态码
   * @param {String} message - 错误消息
   * @param {Array} errors - 错误详情数组（可选）
   */
  constructor(statusCode, message, errors = []) {
    super(message);
    this.statusCode = statusCode;
    this.errors = errors;
    this.name = this.constructor.name;
    Error.captureStackTrace(this, this.constructor);
  }
}

/**
 * 未找到错误类
 * 
 * 表示请求的资源未找到的错误。
 */
class NotFoundError extends ApiError {
  /**
   * 创建一个新的未找到错误
   * 
   * @param {String} message - 错误消息
   */
  constructor(message = '请求的资源未找到') {
    super(404, message);
  }
}

/**
 * 验证错误类
 * 
 * 表示请求数据验证失败的错误。
 */
class ValidationError extends ApiError {
  /**
   * 创建一个新的验证错误
   * 
   * @param {String} message - 错误消息
   * @param {Array} errors - 验证错误详情数组
   */
  constructor(message = '请求参数验证失败', errors = []) {
    super(400, message, errors);
  }
}

/**
 * 未授权错误类
 * 
 * 表示用户未经身份验证的错误。
 */
class UnauthorizedError extends ApiError {
  /**
   * 创建一个新的未授权错误
   * 
   * @param {String} message - 错误消息
   */
  constructor(message = '未授权访问') {
    super(401, message);
  }
}

/**
 * 禁止访问错误类
 * 
 * 表示用户没有足够权限的错误。
 */
class ForbiddenError extends ApiError {
  /**
   * 创建一个新的禁止访问错误
   * 
   * @param {String} message - 错误消息
   */
  constructor(message = '没有足够的权限') {
    super(403, message);
  }
}

/**
 * 冲突错误类
 * 
 * 表示资源冲突的错误，例如尝试创建已存在的资源。
 */
class ConflictError extends ApiError {
  /**
   * 创建一个新的冲突错误
   * 
   * @param {String} message - 错误消息
   */
  constructor(message = '资源已存在') {
    super(409, message);
  }
}

module.exports = {
  ApiError,
  NotFoundError,
  ValidationError,
  UnauthorizedError,
  ForbiddenError,
  ConflictError,
};